package jisuanqi;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
//import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JiSuanQi extends JFrame implements ActionListener{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JTextField tf;        //声明一个名为tf的文本框
	private JButton clear;        //声明一个名为clear的按钮
	private boolean	isNew=true;   //声明一个布尔值型变量isNew,初值是true
	private double result=0;      //声明一个double型变量，名为result，赋值0
	private String preOperator="+";     //声明一个名为preOperator的字符串（之前一个运算符），赋值为“+”
	public JiSuanQi(){
		setSize(300, 400);                           //设置窗体的大小（宽，高）
		setTitle("计算器");                           //设置窗体的标题内容为计算器 
		setVisible(true);                           //设置窗体是（否）可以显示出来
		setDefaultCloseOperation(EXIT_ON_CLOSE);    //客户点击关闭窗口，程序结束
		Font font=new Font("微软雅黑",Font.TRUETYPE_FONT , 24); //定义名为font的字体对象，字体为”微软雅黑“，样式，大小为24号
		JPanel p1=new JPanel();                     //创建名为p1的panel
		p1.setLayout(new BorderLayout());           //p1的布局方式采用borderlayout
		tf=new JTextField("0");                     //文本框tf赋初值为0
		tf.setHorizontalAlignment(JTextField.RIGHT);   //文本框tf输入的内容居右
		tf.setEnabled(false);                          //文本框tf不能输入内容
		tf.setDisabledTextColor(Color.BLUE);          //文本框tf中的文本颜色为蓝色
		clear=new JButton("清除");                   //创建显示为”清除“的按钮clear
		clear.addActionListener(this);              //点击clear按钮的事件监听
		tf.setFont(font);                           //为文本框tf显示的内容设置名为字体名为font的字体
		clear.setFont(font);                        //为按钮clear显示的内容设置名为字体名为font的字体
		p1.add(tf);                                 //往名p1的panel里添加文本框tf
		p1.add(clear,BorderLayout.EAST);            //往名p1的panel里添加按钮clear
		add(p1,BorderLayout.NORTH);                 //添加名为p1的panel到窗体的北边
		String[] str={"7","8","9","+",
				"4","5","6","-",
				"1","2","3","*",
				"0",".","=","/"};                    //创建一个赋值的数组str
		JPanel p2=new JPanel();                      //创建名为p2的panel
		p2.setLayout(new GridLayout(4, 4));          //p2的布局采用gridlayout(4行，4列)
		for(String s:str){                           //foreach语句，把数组str值赋给s
			JButton bt=new JButton(s);               //创建按钮bt,显示内容为s里的值
			bt.setFont(font);                        //给按钮bt设置字体，字体是名为font的字体
			bt.setBackground(new Color(0x0487C8));   //给按钮bt设置背景色，颜色是0x0487C8
			bt.setForeground(new Color(0xffffff));   //给按钮bt设置前景色，颜色是0xffffff
			bt.addActionListener(this);              //bt的事件监听，通过this调用下面重写的方法
			p2.add(bt);                              //把按钮bt添加到名为p2的panel里
		}
		add(p2);                                     //添加名为p2的panel到窗体，默认中间
		
	}
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {  //让窗体布局的加载与窗体的运行同时执行（线程同步）
			@Override
			public void run() {
				new JiSuanQi();
				
			}
		});

	}
	@Override
	public void actionPerformed(ActionEvent e) {       //集成接口ActionListenner，后重写方法  点击后传递点击对象的动作
//		System.out.println(e.getActionCommand());		//输出点击对象的名字
//		System.out.println(e.getSource());  //输出点击的对象

//		JOptionPane.showMessageDialog(this, e.getActionCommand()); 
		//弹出消息提示框显示

//		JOptionPane.showConfirmDialog(this, "你真的退出吗？");
		
		String acmd=e.getActionCommand();           //定义一个名为acmd字符串来记录点击获得的对象名字
		if("0.123456789".indexOf(acmd)>=0)          //判断acmd传的字符串是否是“0.123456789”中的一个
		   numInput(acmd);
		else if(acmd.equals("清除")){                //判断acmd传的字符串是否是“清楚”
			tf.setText("0");
		}                                           //清除文本框tf中显示的内容
	     else{
		   calculator(acmd);            //计算acmd传的字符串
	    }
	}
	
	
	private void calculator(String op) {              //创建一个计算的方法
		isNew=true;                                   
		double num=Double.valueOf(tf.getText());      //声明一个类型为double名为num的值，该值是返回Double型文本框里获取的内容
		switch(preOperator){                   //选择 判断之前运算符的值
		case "+":result+=num;break;            //"+"  result=result+num;
		case "-":result-=num;break;            //"-"  result=result-num;
		case "*":result*=num;break;            //"*"  result=result*num;
		case "/":result/=num;break;           //"/"  result=result/num;
		}
		String rst=String.valueOf(result);   //声明一个类型为String名为str的值，该值是返回String型result
		if(rst.endsWith(".0")){              //判断字符串是否以“.0”的后缀结束 
			rst=rst.substring(0, rst.length()-2);   //返回一个新的rst字符串
		}
		tf.setText(rst);   //文本框tf显示的内容是新的字符串rst
		preOperator=op;   //上一个运算符的传递
	}
	public void numInput(String num){          //给输入的数字构造一个方法
  		String yuan=tf.getText();              //把文本框tf获取到的值存到字符串yuan中
		if(isNew) yuan="0";                   //判断isNew是真 则yuan=0
		if(yuan.equals("0")) {                //判断yuan是否与0相等,是执行116行代码，不是执行123行代码
			isNew=false;                      //yuan==0则isNew为false;
			if(!num.equals("0")){             // 判断输入的数是否与0相等，是的话执行118行代码
				if(num.equals(".")) tf.setText("0.");  //判断输入的数是否为".",是的话文本框tf显示“0.”，不是的话文本框tf显示输入的数
				else tf.setText(num);                 //yuan="0",num！="0"  文本框显示输入的数字
				return;
			}
		}
		else {
			if (yuan.indexOf(".")>=0 && num.equals("."))return;  //判断输入的数在yuan来的文本内容中是否有“.”,并且输入的数是“.”, 则返回
			tf.setText(yuan+num);                                //文本框显示为yuan数和输入的数
		}
	}

}
